home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-ROM Collection / Amiga CD-ROM Collection - Auge 4000 and Cactus and Demo Util.iso / auge4000 / 46 / lib / amiga / main.c < prev    next >
C/C++ Source or Header  |  1990-06-20  |  2KB  |  99 lines

  1.  
  2. /*
  3.  *  _MAIN.C
  4.  *
  5.  *  (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  6.  *
  7.  *  Note that to use this _main we must be a process.  The programmer
  8.  *  can overide our _main with his own if he wishes a task entry.
  9.  *
  10.  *  Note that we open '*' with modes 1005 so if the filesystem is our stderr
  11.  *  we don't create a file called '*'.
  12.  */
  13.  
  14. #include <exec/types.h>
  15. #include <libraries/dos.h>
  16. #include <libraries/dosextens.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <fcntl.h>
  20. #include <lib/bcpl.h>
  21.  
  22. typedef struct CommandLineInterface CLI;
  23. typedef struct Process Process;
  24.  
  25. void *_WBMsg;
  26.  
  27. extern void *GetMsg();
  28. extern void *FindTask();
  29.  
  30. void
  31. _main(len, arg)
  32. short len;
  33. char *arg;
  34. {
  35.     Process *proc = (Process *)FindTask(NULL);
  36.  
  37.     if (proc->pr_Task.tc_Node.ln_Type == NT_PROCESS) {
  38.     /*DOSBase = OpenLibrary("dos.library", 0);*/
  39.  
  40.     if (proc->pr_CIS) {
  41.         _IoStaticFD[0].fd_Fh    =    proc->pr_CIS;
  42.         _IoStaticFD[0].fd_Flags =    O_RDONLY | O_NOCLOSE | O_ISOPEN;
  43.     }
  44.  
  45.     if (proc->pr_COS) {
  46.         _IoStaticFD[1].fd_Fh    =    proc->pr_COS;
  47.         _IoStaticFD[1].fd_Flags =    O_WRONLY | O_NOCLOSE | O_ISOPEN;
  48.     }
  49.  
  50.     if (proc->pr_ConsoleTask) {
  51.         if (_IoStaticFD[2].fd_Fh = Open("*", 1005))
  52.         _IoStaticFD[2].fd_Flags = O_WRONLY | O_ISOPEN;
  53.         else if (_IoStaticFD[2].fd_Fh = _IoStaticFD[1].fd_Fh)
  54.         _IoStaticFD[2].fd_Flags = O_WRONLY | O_NOCLOSE | O_ISOPEN;
  55.     }
  56.     }
  57.  
  58.     _finitdesc(stdin,  0, __SIF_READ | __SIF_NOFREE);
  59.     _finitdesc(stdout, 1, __SIF_WRITE| __SIF_NOFREE);
  60.     _finitdesc(stderr, 2, __SIF_WRITE| __SIF_NOFREE);
  61.  
  62.     if (proc->pr_Task.tc_Node.ln_Type == NT_PROCESS) {
  63.     CLI *cli;
  64.  
  65.     if (cli = BTOC(proc->pr_CLI, CLI)) {
  66.         char **av;
  67.         int ac;
  68.         unsigned char *copy = malloc(len+1);
  69.         unsigned char *cname = (unsigned char *)((long)cli->cli_CommandName << 2);
  70.  
  71.         _slow_bcopy(arg, copy, len);
  72.         copy[len] = 0;
  73.         ac = _parseargs1(copy, len);
  74.         av = malloc((ac + 2) << 2);
  75.         _parseargs2(copy, av+1, ac);
  76.  
  77.         ++ac;   /*    include arg0    */
  78.  
  79.         if (cname) {
  80.         len = *cname;
  81.  
  82.         arg = malloc(len+1);
  83.         _slow_bcopy(cname + 1, arg, len);
  84.         arg[len] = 0;
  85.         }
  86.         av[0] = arg;
  87.         av[ac] = 0;
  88.         exit(main(ac, av));
  89.     } else {
  90.         WaitPort(&proc->pr_MsgPort);
  91.         _WBMsg = GetMsg(&proc->pr_MsgPort);
  92.  
  93.         exit(wbmain(_WBMsg));
  94.     }
  95.     }
  96.     exit(-1);
  97. }
  98.  
  99.